package com.shiro.shiro_demo.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.shiro.shiro_demo.entity.UserToken;
import com.shiro.shiro_demo.enums.LoginType;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.subject.Subject;
import org.junit.runner.Result;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.Mapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
@RequestMapping("/book")
public class BookController {

//    @PostMapping("/login")
//    @ResponseBody
//    public String select(CmfzAdmin c){
//        UsernamePasswordToken token = new
//                UsernamePasswordToken(c.getUsername(),c.getPassword());
////        通过安全管理工具类拿到Subjiect
//        Subject subject =
//                SecurityUtils.getSubject();
////        subject调用login方法
//
//        try {
//            subject.login(token);
//            System.out.println("+++++++++++++++++++成功");
//        } catch (Exception e) {
//            System.out.println("esssss = " + e);
//            e.printStackTrace();
//        }
//        return "ok";
//    }

    /**
     * 用户密码登录
     * @param loginName
     * @param pwd
     * @return
     */
    @PostMapping("/login")
    @ResponseBody
    public String login(String loginName, String pwd){
        UserToken token = new UserToken(LoginType.USER_PASSWORD, loginName, pwd);
        return shiroLogin(token);
    }

//    /**
//     * 手机验证码登录
//     *      注：由于是demo演示，此处不添加发送验证码方法；
//     *          正常操作：发送验证码至手机并且将验证码存放在redis中，登录的时候比较用户穿过来的验证码和redis中存放的验证码
//     * @param phone
//     * @param code
//     * @return
//     */
//    @RequestMapping("phoneLogin")
//    public Result phoneLogin(String phone, String code){
//        // 此处phone替换了username，code替换了password
//        UserToken token = new UserToken(LoginType.USER_PHONE, phone, code);
//        return shiroLogin(token);
//    }

    /**
     * 微信登录
     *      注：由于是demo演示，此处只接收一个code参数（微信会生成一个code，然后通过code获取openid等信息）
     *          其他根据个人实际情况添加参数
     * @param code
     * @return
     */
    @RequestMapping("wechatLogin")
    @ResponseBody
    public String wechatLogin(String code){
        // 此处假装code分别是username、password
        UserToken token = new UserToken(LoginType.WECHAT_LOGIN, code, code, code);
        return shiroLogin(token);
    }

    public String shiroLogin(UserToken token){
        try {
            //登录不在该处处理，交由shiro处理
            Subject subject = SecurityUtils.getSubject();
            subject.login(token);

//            if (subject.isAuthenticated()) {
//                JSON json = new JSONObject();
//                ((JSONObject) json).put("token", subject.getSession().getId());
//
//                return new Result(ResultStatusCode.OK, json);
//            }else{
//                return new Result(ResultStatusCode.SHIRO_ERROR);
//            }
            System.out.println("成功__________________");
            return "成功__________________";
        }catch (Exception e){
            System.out.println("错误__________________"+e);
            return "错误__________________";
        }
    }
//
//    /**
//     * 退出登录
//     * @return
//     */
//    @RequestMapping("/logout")
//    public Result logout(){
//        SecurityUtils.getSubject().logout();
//        return new Result(ResultStatusCode.OK);
//    }

}
